package top.lshaci.learning.springboot.jpaquerydsl.core;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.dsl.BooleanExpression;
import lombok.Getter;
import lombok.ToString;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * DslQueryField
 *
 * @author liangxu
 */
@Getter
@ToString
public class DslQueryField {

    /**
     * 查询字段集合
     */
    private List<Path> paths = new ArrayList<>();

    /**
     * 查询条件匹配方式
     */
    private DslConditionMatcher matcher;

    /**
     * 匹配值
     */
    private Object value;

    /**
     * 构建查询字段对象
     *
     * @param matcher 匹配方式
     * @param value   匹配值
     * @return 查询字段对象
     */
    public static DslQueryField build(DslConditionMatcher matcher, Object value) {
        DslQueryField dslQueryField = new DslQueryField();
        dslQueryField.matcher = matcher;
        dslQueryField.value = value;
        return dslQueryField;
    }

    /**
     * 添加查询字段
     *
     * @param path 查询字段
     */
    public void addPath(Path<?> path) {
        if (path != null) {
            paths.add(path);
        }
    }

    /**
     * 处理匹配为IN类型的数据
     *
     * @return 数据集合
     */
    public List<Object> getListValue() {
        Object value = this.getValue();
        List<Object> list = new ArrayList<>();
        if (value instanceof Iterable) {
            ((Iterable) value).forEach(list::add);
        } else if (ArrayUtil.isArray(value)) {
            list.addAll(Arrays.asList((Object[]) value));
        } else {
            list.add(value);
        }
        return list;
    }

    /**
     * 将当前查询字段对象, 转换为 DSL 查询表达式
     *
     * @return DSL 查询表达式
     */
    public BooleanExpression toBooleanExpression() {
        if (CollUtil.isEmpty(paths)) {
            return null;
        }
        return this.matcher.accept(this);
    }
}
